﻿using BootstrapBlazor.Components;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;

namespace BootstrapBlazorApp.Shared.Data.SYS
{
    public class QueryParameter
    {
        //
        // 摘要:
        //     获得/设置 模糊查询关键字
        public string? SearchText { get; set; }

        //
        // 摘要:
        //     获得 排序字段名称 由 BootstrapBlazor.Components.Table`1.SortName 设置
        public string? SortName { get; set; }

        //
        // 摘要:
        //     获得 排序方式 由 BootstrapBlazor.Components.Table`1.SortOrder 设置
        public SortOrder SortOrder { get; set; }

        //
        // 摘要:
        //     获得/设置 多列排序集合 默认为 Empty 内部为 "Name" "Age desc" 由 BootstrapBlazor.Components.Table`1.SortString
        //     设置
        public List<string> SortList { get; set; } = new List<string>();


        //
        // 摘要:
        //     获得 搜索条件绑定模型 未设置 BootstrapBlazor.Components.Table`1.CustomerSearchModel 时为 BootstrapBlazor.Components.Table`1
        //     泛型模型
        public object? SearchModel { get; set; }

        //
        // 摘要:
        //     获得 当前页码 首页为 第一页
        public int PageIndex { get; set; } = 1;


        //
        // 摘要:
        //     获得 请求读取数据开始行 默认 0
        //
        // 言论：
        //     BootstrapBlazor.Components.Table`1.ScrollMode 开启虚拟滚动 BootstrapBlazor.Components.ScrollMode.Virtual
        //     时使用
        public int StartIndex { get; set; }

        //
        // 摘要:
        //     获得 每页条目数量 由 BootstrapBlazor.Components.Table`1.PageItems 与 BootstrapBlazor.Components.Table`1.PageItemsSource
        //     设置
        public int PageItems { get; set; } = 20;


        //
        // 摘要:
        //     获得 通过列集合中的 BootstrapBlazor.Components.ITableColumn.Searchable 列与 BootstrapBlazor.Components.QueryPageOptions.SearchText
        //     拼装 SearchFilterAction 集合
        public List<SearchModel> Searchs { get; set; } = new List<SearchModel>();



        /// <summary>
        /// 转换
        /// </summary>
        /// <param name="options"></param>
        /// <returns></returns>
        public static QueryParameter GetQueryParameter(QueryPageOptions options)
        {
            var searches = new List<SearchModel>();
            options.AdvanceSearchs.ForEach(o =>
            {
                var temp = o as SearchFilterAction;
                if (temp != null)
                    searches.Add(new SearchModel()
                    {
                        Name = temp.Name,
                        Value = temp.Value.ToString(),
                        Action = temp.Action
                    });
            });
            //options.Searchs.ForEach(o =>
            //{
            //    var temp = o as SearchFilterAction;
            //    if (temp != null)
            //        searches.Add(new SearchModel()
            //        {
            //            Name = temp.Name,
            //            Value = temp.Value.ToString(),
            //            Action = temp.Action
            //        });
            //});
            options.CustomerSearchs.ForEach(o =>
            {
                var temp = o as SearchFilterAction;
                if (temp != null)
                    searches.Add(new SearchModel()
                    {
                        Name = temp.Name,
                        Value = temp.Value.ToString(),
                        Action = temp.Action
                    });
            });
            options.Filters.ForEach(o =>
            {
                var temp = o as SearchFilterAction;
                if (temp != null)
                    searches.Add(new SearchModel()
                    {
                        Name = temp.Name,
                        Value = temp.Value.ToString(),
                        Action = temp.Action
                    });
            });

            return new QueryParameter()
            {
                PageIndex = options.PageIndex,
                PageItems = options.PageItems,
                SearchText = options.SearchText,
                SortName = options.SortName,
                SortList = options.SortList,
                SortOrder = options.SortOrder,
                Searchs = searches
            };
        }

    }
}
